// src/router/index.ts
import { createRouter, createWebHistory } from "vue-router";
import { useUserStore } from "@/stores";
import { getRouters } from "@/api/system/menu";
import { filterAsyncRouter } from "@/utils/routeUtils";
import {
  layoutRouter,
  staticRouter,
  errorRouter,
} from "./modules/staticRouter";

/**
 * 创建路由实例
 */
const router = createRouter({
  history: createWebHistory(),
  // 注意：只包含静态路由，404路由会在动态路由加载后添加
  routes: [...layoutRouter, ...staticRouter],
});

/**
 * 全局前置守卫
 */
let hasLoadAsyncRoutes = false;

router.beforeEach(async (to, _from, next) => {
  const userStore = useUserStore();
  console.log("🔍 [路由守卫] 访问路径:", to.path, "已加载动态路由:", hasLoadAsyncRoutes);

  // 1. 用户未登录：只允许访问登录页
  if (!userStore.token) {
    console.log("🚫 [路由守卫] 用户未登录，重定向到登录页");
    if (to.path === "/auth/login") {
      return next(); // 放行登录页
    } else {
      return next("/auth/login"); // 重定向到登录
    }
  }

  // 2. 用户已登录，但尚未加载动态路由
  if (!hasLoadAsyncRoutes) {
    console.log("⏳ [路由守卫] 开始加载动态路由...");
    try {
      const res = await getRouters();
      const asyncRoutes = filterAsyncRouter(res.data);
      console.log("📋 [路由守卫] 动态路由数据:", asyncRoutes);

      // 动态添加路由
      asyncRoutes.forEach((route) => {
        console.log("➕ [路由守卫] 添加路由:", route.path);
        router.addRoute(route);
      });

      // 最后添加404兜底路由
      errorRouter.forEach((route) => {
        console.log("➕ [路由守卫] 添加404路由:", route.path);
        router.addRoute(route);
      });

      // 标记已加载
      hasLoadAsyncRoutes = true;
      console.log("✅ [路由守卫] 动态路由加载完成");

      // 🔥 关键：重新进入目标路由，确保能匹配到动态路由
      // 使用 replace 避免历史栈污染
      console.log("🔄 [路由守卫] 重新匹配路由:", to.path);
      return next({ ...to, replace: true });
    } catch (error) {
      console.error("❌ [路由守卫] 加载动态路由失败", error);
      // 清除用户状态
      userStore.logout();
      return next("/auth/login");
    }
  }

  // 3. 已登录且动态路由已加载 → 正常放行
  console.log("✅ [路由守卫] 路由放行:", to.path);
  return next();
});

export default router;
